#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
__author__ = "Administrator"
__name__="Python_Pool"
__date__="2016/8/3"
__time__="18:17"
"""
import time
from multiprocessing import Pool

def f(x):
    print x*x
    time.sleep(1)
    return x*x

pool = Pool(processes=4)
# processes 为并发进程数，一般等于服务器核数或者核数的2倍，如果进程过多可能会造成父进程与子进程失联，产生僵尸进程被根进程1回收。
# 当任务之间没有相互关联，不需要内存共享时就可以使用多进程模式。
# 进程池中有一个进程处理完，就会有一个新的进程放入进程池，而不是等待进程池中的进程全部处理完。
"""
res_list = []
for i in range(10):
    res = pool.apply_async(f,[i,])
    # 起多进程的方法三，异步模式，进程默认启动；apply_async 改成apply则变成串行执行。
    # 等同于：res = Process(target=f,args=[i,])
    res_list.append(res)
    # 把启动的子进程对象放入一个列表中

if __name__ == '__main__':  # 在Windows下会报错，在Linux下执行没问题
    for r in res_list:
        print r.get(timeout=2)  # 取子进程，timeout进程超时时间
"""
# 下面的写法一句等同于上面注释部分。
print pool.map(f,range(10))

"""
一：当有多个变量的情况---变量有具体个数
import time
from multiprocessing import Pool

def f(x,y):
    #print x*y
    time.sleep(1)
    return x*y

pool = Pool(processes=1)
res =  pool.apply_async(f,[2,3])
print  res.get()
"""

"""
import time
from multiprocessing import Pool

def f(x,y):
    print x + y
    time.sleep(1)
    return x*y

pool = Pool(processes=1)
def x(a,b):
    res =  pool.apply_async(f,(a,b))
    print res.get()
x(2,3)

结果：
5
6
"""



"""
二：当有多个变量的情况---变量没有具体个数
import time
from multiprocessing import Pool

def f(x,y):
    #print x*y
    time.sleep(1)
    return x*y

res_list=[]
pool = Pool(processes=1)
for i in range(5):
    res =  pool.apply_async(f,[i,3])
    res_list.append(res)
for h in res_list:
    print h.get()
"""
